﻿#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<vector>
using namespace std;
//int main()
//{
//	int i = 0;
//	int& ri = i;
//	const int ci = 42; // 顶层const
//	int* const p1 = &i; // 顶层const
//	const int* p2 = &ci; // 底层const
//	const int& ri1 = ci; // 底层const
//	const int& ri2 = i; // 底层const
//	auto j = ri; // j类型为int
//	j++;
//	auto k = i; // k类型为int
//	k++;
//	auto r1 = ci; // r1类型为int，忽略掉顶层const
//	r1++;
//	auto r2 = p1; // r2类型为int*，忽略掉顶层const
//	r2++;
//	auto r3 = p2; // r3类型为const int*，保留底层const
//	// (*r3)++; // 报错
//	auto r4 = ri1; // r4类型为int，因为ri1是ci的别名，ci本⾝的const是⼀个顶层const被忽略掉了
//	r4++;
//	auto r5 = ri2; // r5类型为int
//	r5++;
//	const auto r7 = ci; // r7类型为const int
//	auto& r8 = ri1; // r8类型为const int&
//	auto& r9 = ri2; // r9类型为const int&
//	auto& r10 = ci; // r10类型为const int&
//	auto& r11 = ri; // r11类型为int&
//	//r7++; // 报错
//	//r8++; // 报错
//	//r9++; // 报错
//	//r10++; // 报错
//	r11++;
//	return 0;
//}

void func(int& x)
{
	cout << "void func(int& x)" << endl;
} 
void func(int&& x)
{
	cout << "void func(int&& x)" << endl;
} 
void func(const int& x)
{
	cout << "void func(const int& x)" << endl;} 
void func(const int&& x)
{
	cout << "void func(const int&& x)" << endl;
} 
int main()
{
	int x = 10;
	const int cx = 20;
	auto& rx1 = x; // int&
	auto& rx2 = cx; // const int&
	func(rx1);
	func(rx2);
	const auto& rx3 = x; // const int&
	const auto& rx4 = cx; // const int&
	func(rx3);
	func(rx4);
	// 万能引⽤
	auto&& rx5 = x; // int&
	auto&& rx6 = cx; // const int&
	func(rx5);
	func(rx6);
	auto&& rx7 = move(x); // int&&
	//rx7++;
	auto&& rx8 = move(cx); // const int&&
	//rx8++;
	func(forward<int>(rx7));
	func(forward<const int>(rx8));
	return 0;
}